热力图覆盖物 Sample详情

最后更新时间:2019年7月5日

热力图覆盖物,以热力图的形式展示地图中的点位数据,通常用于模拟某部分区域的点数据密集程度,在实际生活应用非常广泛,例如展示景区中游客的分布情况。

1 构造数据

实现热力图覆盖物,需要构造坐标点,作为数据基础。通常情况下,可查询地图中的点图层,获取点位数据;也可通过其他方式获取,例如解析json文件中的点位数据;方法有多种,根据实际情况选择,在此展示通过查询获取的方式。

首先准备好地图数据,然后查询“村庄”图层中,位于洪山区(Code=420111)的所有点要素,获取其坐标。查询功能的实现可参照要素查询模块学习。具体实现代码如下:

//获取vectorlayer:以“村庄”图层
long layerIndex=[_mapView.map indexOfName:@"村庄"];
MGSMapLayer *mapLayer=[_mapView.map getLayerAtIndex:layerIndex];
MGSVectorLayer *vectorLayer=(MGSVectorLayer *)mapLayer;

//要素查询实例
MGSFeatureQuery *featureQuery=[[MGSFeatureQuery alloc] initWithVectorLayer:vectorLayer];
//属性查询条件
NSString *queryCondition=@"Code = '420111'";  //Code为420111的代表洪山区
[featureQuery setWhereClause:queryCondition];
[featureQuery setPageSize:20];

//查询
MGSFeaturePagedResult *queryResult=[featureQuery query];
//所有要素数
long featureCount=[queryResult totalFeatureCount];
//未查询到结果
if (featureCount <= 0) {
    return;
}

//遍历每一页的结果
for (int i=0; i < queryResult.pageCount; i++) {
    NSArray<MGSFeature *> *featureArray=[queryResult getPageWithPageNumber:i+1];
    //获取一页中所有要素
    for (int j=0; j < [featureArray count]; j++) {
        //获取要素
        MGSFeature *feature=featureArray[j];

        //获取几何信息
        MGSGeometry *fGeometry=[feature geometry];
        MGSGeometryType featureType=[fGeometry type];
        if (featureType==1) {  //单点
            MGSGeoPoint *geoPoint=(MGSGeoPoint *)fGeometry;
            MGSDot3D dot3D=geoPoint.dot3D;
            MGSDot dot=MGSDotMake(dot3D.x, dot3D.y);
        }
        if (featureType==2) {  //多点
            MGSGeoPoints *points=(MGSGeoPoints *)fGeometry;
            for (int m=0; m < points.length; m++) {  //获取多点中的每个点
                MGSDot3D dot3D=[points getDot3DWithIndex:m];
                MGSDot dot=MGSDotMake(dot3D.x, dot3D.y);
            }
        }
    }
}

2 构造热力图

1

构造热力图点

根据查询获取到的要素坐标点MGSDot,来构造热力图点MGSHeatMapPoint。

//热力图点个数:即查询的所有要素点个数
long heatMapPointCount=featureCount;
//热力图点(根据所有要素坐标点构造热力图点)
MGSHeatMapPoint heatMapPoint1=MGSHeatMapPointMake(dot, 1);
//构造热力图点对象
MGSHeatMapPoint* mHeatMapPoints=malloc(sizeof(MGSHeatMapPoint) * heatMapPointCount);   //根据要素点的数量构造
//然后将构造的所有热力图点赋予它(在此简略)
mHeatMapPoints[0]=heatMapPoint1;

代码解析:构造MGSHeatMapPoint时,第二个参数表示热力图点的权重值,在实际应用中可根据点要素属性值来设置,权重越大,点的颜色越深,从而能够根据热力图中颜色的深浅来判断点位属性值的大小情况。

2

构造热力图

在准备好热力图点之后,就可构造热力图了。

//创建热力图对象
MGSGraphicHeatmap *graphicHeatMap=[[MGSGraphicHeatmap alloc] init];
[graphicHeatMap setMinAlpha:0];    //最小透明度,0:不透,100:全透
[graphicHeatMap setMaxAlpha:100];  //最大透明度,0:不透,100:全透
[graphicHeatMap setPointSize:50];  //热力点的大小(点的半径)单位:像素
//设置热力点、点个数
[graphicHeatMap setHeatmapPoints:mHeatMapPoints andCount:heatMapPointCount];

代码解析:最小透明度即热力图点中心的透明度,最大透明度即热力图点最边缘的透明度,通过这两个参数设置,可以实现热力图的透明度变化效果,更加美观。

3

构造视觉映射组件

热力图得以展示在地图中,是依赖于视觉映射组件MGSVisualMap的,所以构造完热力图之后,还需构造视觉映射组件。构造时需为其设置最小最大值,热力图点的权重值需介于此范围内。

//视觉映射组件
MGSVisualMap *visualMap=[[MGSVisualMap alloc] init];
[visualMap setMinValue:1];   //视觉映射的最小值
[visualMap setMaxValue:10];  //视觉映射的最大值

//为热力图对象设置视觉映射组件
[graphicHeatMap setVisualMap:visualMap];

4

绘制热力图

将热力图覆盖物添加到覆盖物图层中进行绘制,刷新即可看到效果。

[_mapView.graphicsOverlay addGraphic:graphicHeatMap];
[_mapView refresh];

重要说明:在展示热力图之前,需要对地图视图MGSMapView进行额外属性设置。目前热力图只支持2D平面模式,即在地图倾斜的时候无法满足,所以需要设置地图倾斜角为0,并禁用地图倾斜手势。

[_mapView setSlopeAngle:0 animate:NO];
[_mapView setMapSlopeGestureEnabled:NO];

实现效果如下图所示:

热力图覆盖物.jpg